package com.qf.smsplatform.interfaces.controller;



import com.qf.smsplatform.interfaces.exception.SmsException;
import com.qf.smsplatform.interfaces.form.SmsInterfaceForm;
import com.qf.smsplatform.interfaces.service.SmsInterfaceService;
import com.qf.smsplatform.interfaces.util.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

@RestController
public class SmsInterfaceController {

     /*
    1	clientID	客户ID	是	字符型	由服务方提供
    2	srcID	下行编号	否	长整形	默认为空，非空保证唯一不能重复
    3	mobile	目的手机号	是	字符型	非空，多个号请用英文逗号隔开，最多100个号码，
    4	content	消息的内容	是	字符型	内容长度<=500字符，以utf-8的方式编码
    5	pwd	密码	是	字符型	由服务方提供,格式：MD5(password)32位大写
     */

    // TODO  添加到配置文件中,引入到当前类里,通过split(",")

    private static final String[] IP_HEADERS = {
            "X-Forwarded-For",
            "Proxy-Client-IP",
            "WL-Proxy-Client-IP",
            "HTTP_X_FORWARDED_FOR",
            "HTTP_X_FORWARDED",
            "HTTP_X_CLUSTER_CLIENT_IP",
            "HTTP_CLIENT_IP",
            "HTTP_FORWARDED_FOR",
            "HTTP_FORWARDED",
            "HTTP_VIA",
            "REMOTE_ADDR" };

    @Resource
    private SmsInterfaceService smsInterfaceService;

    @RequestMapping("/smsInterface")
    public R smsInterface(SmsInterfaceForm smsInterfaceForm, HttpServletRequest req) {
        //1. 接收客户端请求的ip地址    客户端请求可能通过了反向代理Nginx,还有客户方自己的一些诡异的软件,导致req.getRemoteAddr()无法获取正确的ip.
        //  先尝试从请求头中获取正确的ip
        String ip = this.getReallyIPAddress(req);

        //2. 封装参数.
        smsInterfaceForm.setIp(ip);

        try {
            //3. 调用Service对所有参数,进行校验.
//            smsInterfaceService.checkParameters(smsInterfaceForm);
            smsInterfaceService.checkParameters(smsInterfaceForm);
            //4.1 没有错误. 0 - 接收成功
            return R.ok();
        } catch (SmsException e) {
            e.printStackTrace();
            //4.2 出现问题,返回错误信息
            if (e.getCode() == 0) {
                //个特别的手机号出错，但是短信正常发送
            return  R.error(e.getCode(),e.getMessage(),e.getErrorMpbile());
            } else {
                return R.error(e.getCode(), e.getMessage());
            }

        }


    }

    /**
     * 获取正确的ip地址
     * @param req
     * @return
     */
    private String getReallyIPAddress(HttpServletRequest req) {
        // 健壮性校验
        if(IP_HEADERS != null && IP_HEADERS.length > 0){
            // 遍历数组,
            for (String ipHeader : IP_HEADERS) {
                // 通过req,获取请求头信息
                String ip = req.getHeader(ipHeader);
                // 判断是否获取到了ip地址
                if(!StringUtils.isEmpty(ip) && !"unknown".equalsIgnoreCase(ip)){
                    // 直接返回
                    return ip;
                }
            }
        }
        // 循环结束,没有执行return,说明请求头中没有获取到ip地址信息
        return req.getRemoteAddr();
    }


}
